Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 15 Grundlagen zum Erstellen einer Windows-Anwendung
  gp 15.1 Die Entwicklungsumgebung
  gp 15.2 Eine erste Windows-Anwendung
  gp 15.3 Die Internas einer Windowsanwendung
    gp 15.3.1 Projekteinstellungen
    gp 15.3.2 Das Anwendungsframework
    gp 15.3.3 Die Klasse »MyApplication«
    gp 15.3.4 Die Ereignisse des »MyApplication«-Objekts
  gp 15.4 Ereignisse grafischer Windows-Komponenten
    gp 15.4.1 Grundlegende Anmerkungen
    gp 15.4.2 Ereignisse mit Ereignisdaten
    gp 15.4.3 Ereignishandler mit dem Visual Studio 2005 bereitstellen
    gp 15.4.4 Ereignisbehandlung mit den »OnXxx«-Methoden
  gp 15.5 Die Basisklassen einer Form
    gp 15.5.1 Die Klasse »Control«
    gp 15.5.2 Die Klasse »ScrollableControl«
    gp 15.5.3 Die Klasse »ContainerControl«
  gp 15.6 Die Eigenschaften einer Form
    gp 15.6.1 Die Rahmendarstellung einer Form
    gp 15.6.2 Formspezifisches Symbol festlegen
    gp 15.6.3 Die Schaltflächen in der Titelleiste
    gp 15.6.4 Spielereien mit »Opacity« und »TransparencyKey«
    gp 15.6.5 Fenster, die nicht verdeckt werden können
    gp 15.6.6 Den Mauszeiger verändern
    gp 15.6.7 Farbeinstellungen mit dem Typ »Color«
    gp 15.6.8 Schriftart mit dem Typ »Font«
    gp 15.6.9 Die Abmessungen einer Form festlegen
    gp 15.6.10 Die Position eines Fensters
    gp 15.6.11 Die Anzeigezustand eines Fensters nach dem Öffnen
    gp 15.6.12 Die Arbeitsfläche des Fensters (der Clientbereich)
    gp 15.6.13 Die Auflistung »ControlsCollection«
    gp 15.6.14 Zusammenfassung der Eigenschaften des Form-Objekts
  gp 15.7 Ereignisse einer Form
    gp 15.7.1 Ereignisse beim Erzeugen eines Fenster
    gp 15.7.2 Größenänderung einer Form
    gp 15.7.3 Ereignisse beim Schließen eines Fensters
  gp 15.8 Anwendungen mit mehreren Fenstern
    gp 15.8.1 Neue Forms hinzufügen
    gp 15.8.2 Formulare laden, anzeigen, verstecken und schließen
    gp 15.8.3 Mehrere Fenster verwalten
    gp 15.8.4 Formulare in einem eigenen Thread laufen lassen
    gp 15.8.5 Splash-Fenster
  gp 15.9 Modale Dialogfenster
    gp 15.9.1 Layout eines Dialogfensters
    gp 15.9.2 Die Eigenschaft »DialogResult«
    gp 15.9.3 Eine Form modal öffnen
    gp 15.9.4 Die Weitergabe von Resultaten aus einem Dialog
    gp 15.9.5 Fokussierreihenfolge und Standardschaltflächen
  gp 15.10 Meldungsfenster mit »MessageBox«
    gp 15.10.1 Die Methode »MessageBox.Show«
    gp 15.10.2 Der Rückgabewert der Meldungsfenster
  gp 15.11 Das Speichern in der Registrierungsdatenbank
    gp 15.11.1 Die Klassen »Registry« und »RegistrKey«
    gp 15.11.2 Programmbeispiel zum Speichern in der Registrierung
  gp 15.12 Die Klasse »Application«
    gp 15.12.1 Die Datei »AssemblyInfo.vb«
    gp 15.12.2 Mit »Application.DoEvents« wartende Ereignisse abrufen
    gp 15.12.3 Zusammenfassung Eigenschaften und Methoden


Galileo Computing

15.9 Modale Dialogfenster  downtop

Beim Start einer Windowsanwendung wird zunächst das Start- bzw. Hauptfenster der Anwendung geöffnet und angezeigt. Davon ausgehend sind im Verlauf einer Sitzung häufig weitere Fenster notwendig, die Einstellungen oder Eingaben vom Anwender anfordern. Diese werden entweder mit einer OK-Schaltfläche bestätigt oder mit einer Abbrechen-Schaltfläche für ungültig erklärt. In beiden Fällen wird danach das Fenster automatisch geschlossen und das aufrufende Fenster aktiviert. Forms, die sich auf diese Weise in die Laufzeit einer Anwendung eingliedern, werden als Dialogfenster bezeichnet.

Dialogfenster sind modal. Das bedeutet, dass solange kein anderes Fenster der Anwendung aktiviert werden kann, bis das modale Fenster geschlossen wird. Allerdings ist es bei einem geöffneten modalen Dialog möglich, ein Formular einer anderen Anwendung zu aktivieren – es sei denn, der Dialog wird systemmodal angezeigt, um auf schwerwiegende Systemfehler hinzuweisen.


Galileo Computing

15.9.1 Layout eines Dialogfensters  downtop

Die Entwicklung eines modalen Dialogfensters unterscheidet sich nicht von der Entwicklung einer herkömmlichen Form. Allerdings sind dabei ein paar spezifische Besonderheiten zu beachten.

Für die Darstellung des modalen Dialogs wird üblicherweise eine unveränderliche Größe festgelegt, z.  B. FormBorderStyle.FixedDialog, die Anzeigeposition ist meist StartPosition.CenterScreen, also zentral auf dem Bildschirm. Ein Dialog, der eine unveränderliche Größe hat, sollte nicht maximiert werden können. Außerdem ist es unüblich, mit der Minimieren-Schaltfläche einen Dialog in die Taskleiste zu legen. MinimizeBox und MaximizeBox sind daher in der Regel auf False eingestellt.


Galileo Computing

15.9.2 Die Eigenschaft »DialogResult«  downtop

Modale Dialoge haben fast alle eine OK- und eine Abbrechen-Schaltfläche, manche auch noch Wiederholen- und/oder Ignorieren-Schaltflächen. Die den modalen Dialog aufrufende Form übernimmt nach dem Klicken die Eintragungen des Benutzers im Dialog, wenn der Benutzer OK geklickt hat oder verwirft sie beim Klicken auf die Abbrechen-Schaltfläche. Das passiert natürlich nicht automatisch, vielmehr müssen Sie die passende Reaktion des Programms codieren.

Um die aufrufende Form darüber zu informieren, welche Schaltfläche der Anwender im Dialog geklickt hat, ist in der Form-Klasse die Eigenschaft DialogResult definiert. Die Werte, die diese Eigenschaft annehmen kann, sind in der gleichnamigen Enumeration definiert.


Tabelle 15.13     Mitglieder der Enumeration »DialogResult«

Member Beschreibung
None Es wird kein Wert vom Dialogfeld zurückgegeben. Dies bedeutet, dass das modale Dialogfeld weiterhin ausgeführt wird.
OK Wird üblicherweise von einer Schaltfläche mit der Bezeichnung OK gesendet.
Cancel Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Abbrechen gesendet.
Abort Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Abbrechen gesendet. Das entspricht dem Member Cancel, im deutschsprachigen Raum gibt es zu den Schaltflächen Abort und Cancel keine eindeutigen Pendants.
Retry Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Wiederholen gesendet.
Ignore Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Ignorieren gesendet.
Yes Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Ja gesendet.
No Wird üblicherweise von einer Schaltfläche mit der Bezeichnung Nein gesendet.

Die Bezeichner der DialogResult-Konstanten entsprechen den üblichen Beschriftungen der Schaltflächen, die uns aus den verschiedenen Dialogen bekannt sind. Hat der modale Dialog in seiner Titelleiste ganz rechts auch die zum Schließen bestimmte X-Schaltfläche, entspricht deren Aktivierung dem Rückgabewert DialogResult.Cancel.

Jetzt stellt sich noch die Frage: Wie wird der Eigenschaft DialogResult der modalen Form der Wert zugewiesen, der einer bestimmten Schaltfläche entspricht? Sie könnten das im Ereignishandler des Click-Ereignisses codieren, z.  B.:


Private Sub btnOK_Click(ByVal sender As Object, ByVal e As EventArgs)
Me.DialogResult = DialogResult.OK
End Sub

Noch einfacher ist die Zuhilfenahme des Eigenschaftsfensters, denn der Typ Button hat ebenfalls eine Eigenschaft DialogResult. Wählen Sie nur gewünschte Konstante für das entsprechende Button-Objekt in der Wertespalte aus (siehe auch Abbildung 15.16).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.16     Die Eigenschaft »DialogResult« eines Buttons

Weist die DialogResult-Eigenschaft eines Buttons einen Wert auf, der nicht None ist, wird der Wert beim Anklicken automatisch an das übergeordnete Dialogfenster weitergeleitet. Dieses wird daraufhin geschlossen und die Steuerung an das aufrufende Formular zurückgegeben. Der Aufruf von Close auf die Form ist unnötig.


Galileo Computing

15.9.3 Eine Form modal öffnen  downtop

Mit Show wird ein Fenster auf dem Bildschirm im Zustand modeless angezeigt. Show hat auch keinen Rückgabewert. Um eine Form modal zu öffnen, gibt es eine andere, überladene Methode: ShowDialog. Zwei Überladungen stelle ich Ihnen vor. Wir werden beide noch im Programmcode erleben.


Public Function ShowDialog() As DialogResult
Public Function ShowDialog(IWin32Window) As DialogResult

Das modale Öffnen hat zur Folge, dass im aufrufenden Formular die Anweisungen, die ShowDialog folgen, solange nicht ausgeführt werden, bis der modale Dialog geschlossen wird. Mit dem Schließen liefert die modale Form gleichzeitig auch als Resultat den Inhalt seiner Eigenschaft DialogResult beim Aufrufer ab. Jetzt kann die aufrufenden Form das Ergebnis prüfen und, je nachdem, welche Schaltfläche zum Beenden des Dialogs geführt hat, passend reagieren. Das könnte beispielsweise wie folgt aussehen, wenn der Dialog eine OK- und eine Abbrechen-Schaltfläche hat:


Dim dialogFrm As DialogForm = New DialogForm()
If System.Windows.Forms.DialogResult.Cancel = _
dialogFrm.ShowDialog() Then
' der modale Dialog wurde mit 'Abbrechen' geschlossen
Else
' der modale Dialog wurde mit 'OK' geschlossen
End If

Enthält ein modaler Dialog mehr als zwei auszuwertende Schaltflächen, muss ein anderer Weg beschritten werden, um nicht unglücklicherweise mehrfach denselben Dialog zu öffnen. Hier bieten sich zwei Möglichkeiten an. Die erste ist das Zuweisen der Rückgabe an eine Variable vom Typ DialogResult, die in If-Zweigen geprüft wird:


Dim result As DialogResult = dialogFrm.ShowDialog()
If result = System.Windows.Forms.DialogResult.OK Then
...
ElseIf result = Windows.Forms.DialogResult.Cancel Then
...
ElseIf result = Windows.Forms.DialogResult.Ignore Then
...
End If

Etwas eleganter ist eine Select-Anweisung, um in den Case-Zweigen auf den Rückgabewert zu reagieren:


Select Case dialogFrm.ShowDialog()
Case Windows.Forms.DialogResult.OK
...
Case Windows.Forms.DialogResult.Cancel
...
Case Windows.Forms.DialogResult.Ignore
End Select


Galileo Computing

15.9.4 Die Weitergabe von Resultaten aus einem Dialog  downtop

Häufig kommt es vor, dass in einem Dialogfenster in verschiedenen Steuerelementen Einträge vorgenommen werden, die nach dem Schließen des Dialogs im Hauptfenster benötigt werden. Nehmen wir beispielsweise an, dass sich im Dialog ein Texteingabefeld befindet, dessen Inhalt die aufrufende Form auswerten soll. Die modaltypischen Schaltflächen, z.  B. OK oder Abbrechen können über die Information hinaus, die zum Beenden des Dialogs geführt hat, hinaus keine weiteren Daten an das aufrufende Formular übermitteln. Allerdings wird nach dem Schließen eines Dialogs das Fenster nicht zerstört sondern nur ausgeblendet. Somit können Sie über dessen Referenz weiterhin alle nichtprivaten Mitglieder abfragen.

Übernehmen-Schaltflächen unterscheiden sich von den anderen Schaltflächen eines Dialogs dadurch, dass das Hauptfenster die im Dialog vorgenommenen Einstellungen übernimmt, das Dialogfenster aber weiterhin geöffnet bleibt. Das erfordert natürlich eine vollkommen andere Vorgehensweise, da mit der Zuweisung an DialogResult ein modaler Dialog geschlossen wird – zumindest solange diese Eigenschaft nicht den Inhalt None hat.

Im folgenden Beispielprogramm hat der modale Dialog neben einer Textbox und den beiden Schaltflächen OK und Abbrechen auch eine Schaltfläche Übernehmen (siehe Abbildung 15.17). Wird auf letztere geklickt, soll sich der Inhalt der Textbox in die Titelleiste des Hauptfensters schreiben. Üblicherweise werden Übernehmen-Schaltflächen nur dann aktiviert, wenn tatsächlich zu verarbeitende Daten vorliegen. Wir müssen daher Code schreiben der bei jeder Änderung des Textboxinhalts prüft, ob sich dieser vom aktuellen Titelleistentext des Hauptfensters unterscheidet. Darauf muss dann entsprechend reagiert werden. Außerdem soll die Textbox beim Öffnen des Dialogfensters den Titelleistentext anzeigen.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.17     Modaler Dialog mit Schaltfläche »Übernehmen«

Wenden wir uns dem Code des Dialogs zu. Durch Klicken auf Übernehmen wird signalisiert, dass dem Hauptfenster neue Daten bereitgestellt werden. Das Click-Ereignis der Übernehmen-Schaltfläche kann jedoch nur im Dialogfenster behandelt werden. Das Hauptfenster nimmt von den Ereignissen, die im dialogintern ausgelöst werden, keine Notiz und weiß nicht, wann es Daten verarbeiten kann.

Um das gewünschte Verhalten zu erzielen, kann das Click-Ereignis weiterleitet werden. Man erreicht das, indem man im Ereignishandler ein weiteres Ereignis ausgelöst. Dieses ist dialogspezifisch und wird auf Klassenebene definiert und soll Apply heißen. Das den Dialog aufrufende Fenster kann das dialogspezifische Ereignis Apply an eine eigene Methode binden und in dieser die Daten des Dialogs verarbeiten. Das folgende Codefragment zeigt den dazu erforderlichen Programmcode.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 15\ÜbernehmenSchaltfläche
' ----------------------------------------------------------
Public Class DialogForm
' Deklaration des Ereignisses "Apply"
Public Event Apply As EventHandler
Private Sub btnUebernehmen_Click(...) _
Handles btnUebernehmen.Click
RaiseEvent Apply(Me, e)
Me.btnUebernehmen.Enabled = False
End Sub
Private Sub TextBox1_TextChanged(...) _
Handles TextBox1.TextChanged
If Me.TextBox1.Text = Me.Owner.Text Then
Me.btnUebernehmen.Enabled = False
Else
Me.btnUebernehmen.Enabled = True
End If
End Sub
Private Sub DialogForm_Load(...) _
Handles MyBase.Load
Me.TextBox1.Text = Me.Owner.Text
End Sub
End Class

Klickt der Anwender auf die Schaltfläche Übernehmen, wird innerhalb des Ereignishandlers Apply ausgelöst. Da Click vom Typ EventHandler ist und die Übergabe der Referenz auf die Ereignisquelle sowie die Referenz auf ein Objekt des Typs EventArgs verlangt, werden mit


RaiseEvent Apply(Me, e)

auch alle Argumente weitergeleitet.

Nachdem das Ereignis Apply der aufrufenden Form signalisiert hat, dass neue Daten bereitgestellt werden, kann die Übernehmen-Schaltfläche deaktiviert werden. Dazu wird die Eigenschaft Enabled=False gesetzt.

Ehe wir uns weiter dem Code im Dialog widmen, sehen wir uns zunächst den Code des aufrufenden Hauptfensters an. Dieses enthält nur die Schaltfläche zum Öffnen des modalen Dialogs.


Public Class Form1
Private Sub btnOpenDialog_Click(...) _
Handles btnOpenDialog.Click
Dim frm As New DialogForm
AddHandler frm.Apply, AddressOf SetFormText
Dim dr As DialogResult = frm.ShowDialog(Me)
If dr = System.Windows.Forms.DialogResult.OK Then
Me.Text = frm.TextBox1.Text
End If
End Sub
' Ereignishandler des Ereignisses Apply
Private Sub SetFormText(...)
Me.Text = CType(sender, DialogForm).TextBox1.Text
End Sub
End Class

Im Ereignishandler btnOpenDialog_Click wird die Klasse DialogForm instanziert und das Ereignis Apply des Objekts mit einem Ereignishandler verknüpft. Aufgerufen wird der Dialog mit der parametrisierten Variante von ShowDialog, der die Referenz auf das aufrufende Hauptfenster übergeben wird. Der modale Dialog empfängt die Übergabe und speichert sie automatisch in seiner Eigenschaft Owner. Damit hat der modale Dialog auch jederzeit direkten Zugriff auf die aufrufende Form. Zum Schluss erfolgt noch die Überprüfung, ob der modale Dialog mit OK geschlossen worden ist. In diesem Fall gilt es, den Inhalt der Textbox auszuwerten.

Kommen wir noch einmal zurück zur Klassendefinition von DialogForm. Nach dem Öffnen des Dialogs soll die Textbox den Inhalt der Titelleiste des aufrufenden Dialogs enthalten. Hier kommt uns zugute, dass wir beim Aufruf von ShowDialog die Referenz auf den Aufrufer übergeben haben. So können wir im Load-Ereignis über Owner die Titelleiste abfragen und der Text-Eigenschaft der Textbox zuweisen.

Eine Textbox reagiert auf jede Änderung im Eingabefeld und löst das Ereignis TextChanged aus. Wir machen uns das im Dialog zunutze, um die Aktivierung/Deaktivierung der Schaltfläche Übernehmen zu steuern. Entspricht der Inhalt der Textbox exakt der Titelleiste des Hauptfensters, gibt es nichts vom Hauptfenster zu übernehmen und die Schaltfläche wird mit der Eigenschaft Enabled deaktiviert (Enabled=False). Weicht der Inhalt der Textbox von der Titelleiste ab, ist der Button aktiviert (Enabled=True).


Galileo Computing

15.9.5 Fokussierreihenfolge und Standardschaltflächen  toptop

Eigentlich könnten wir mit dem Ergebnis zufrieden sein, denn der Dialog zeigt bereits alle typischen Verhaltensmerkmale. Ein wenig selbstkritisch sollten wir aber dennoch sein, denn es gibt noch ein paar Verbesserungen vorzunehmen. Damit sind die folgenden beiden Punkte gemeint:

gp  die Fokussierreihenfolge der Steuerelemente
gp  Sonderfunktionen der (Enter)- und (ESC)-Tasten

Wenden wir uns zunächst der Fokussierreihenfolge zu.

Die Fokussierreihenfolge

Alle fokussierbaren Steuerelemente einer Form können mit der (Tab)-Taste der Reihe nach aktiviert werden. Nach dem Öffnen und Anzeigen eines Formulars sollten zuerst die Steuer-elemente aktiviert werden, die eine Eingabe vom Anwender erwarten, anschließend die Schaltflächen. Innerhalb dieser beiden Gruppen ist die Fokussierreihenfolge konventionsgemäß zuerst von links nach rechts, danach von oben nach unten. Das gilt natürlich nicht nur für modale Dialoge, auch alle anderen Forms sollten sich daran halten.

Mit der Eigenschaft TabIndex der Steuerelemente können wir die Fokussierreihenfolge in einer Form vorschreiben. Dabei erhält das Element zuerst den Fokus, dessen TabIndex-Eigenschaft den Wert 0 hat, danach wird das Steuerelement mit dem Wert 1 fokussiert usw. TabIndex wird in der Reihenfolge vergeben, in der die Controls der Form hinzugefügt werden. Sie können die Werte im Eigenschaftsfenster der Steuerelemente auch beliebig den Erfordernissen anpassen.

Wird der Dialog unseres letzten Beispiels geöffnet, sollte sich der Eingabecursor in der Textbox befinden, um den Anwender die sofortige Eingabe zu ermöglichen. Die Eigenschaft TabIndex dieses Steuerelements hat demnach den Wert 0. In der Aktivierungsreihenfolge schließt sich dann die OK-Schaltfläche an, gefolgt von Abbrechen und Übernehmen. Die Werte von TabIndex sind für die drei Schaltflächen entsprechend 1, 2 und 3.

Die Standardschaltflächen eines Fensters

Bei vielen Forms kommt der (Enter)-Taste (Eingabetaste) eine besondere Bedeutung zu. Ist eine Schaltfläche fokussiert und wird die (Eingabetaste) gedrückt, wird das Click-Ereignis der fokussierten Schaltfläche ausgelöst. Wird die (Enter)-Taste gedrückt, während beispielsweise eine Textbox den Fokus hat, reagieren viele Formulare so, als sei die OK-Schaltfläche angeklickt worden.

Um eine bestimmte Schaltfläche zur Standardschaltfläche eines Formulars zu erklären, veröffentlicht die Klasse Form die Eigenschaft AcceptButton. Wollen wir die OK-Schaltfläche zur Standardschaltfläche unseres modalen Dialogs machen, muss die Anweisung lauten:


Me.AcceptButton = btnOK

Ein ähnliches Verhalten zeigen Formulare, wenn die (ESC)-Taste gedrückt wird. Allerdings entspricht das nicht dem Klicken auf die OK-Schaltfläche, sondern ist gleichbedeutend mit dem Klicken auf Abbrechen – das Formular wird geschlossen. Diesmal müssen wir der Eigenschaft CancelButton der Form die Referenz der formeigenen Abbrechen-Schaltfläche bekannt geben:


Me.CancelButton = btnAbbrechen

AcceptButton und CancelButton können natürlich auch im Eigenschaftsfenster eingestellt werden.

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de